package com.lry.basic.algorithm.encrypt;

import java.util.ArrayList;
import java.util.List;

public class RSA {
    public static void main(String[] args) {
        int a = 3,b=7;
        int n = a*b;
        int e = 5;//从（1-fn）随机取一个质数作为公钥
        int fn = (a-1) * (b-1);//欧拉定理，欧拉函数
        //e*d % fn = 1 => e*d = fn*k+1(k>=1) => 5d = 72k + 1 (k>=1)

        int d = -1;//私钥
        for(int k=1;k<=Integer.MAX_VALUE;k++){
            if((fn*k+1)%e==0){
                d = (fn*k+1)/e;
                break;
            }
        }

        //可以加密绝对值小于n的数
        List<Integer> ori = new ArrayList<>();
        for(int i=-20;i<=20;i++){
            ori.add(i);
        }
        System.out.println("明文："+ori);

        List<Integer> s = new ArrayList<>();
        for(int m:ori){
            int c = (int) (Math.pow(m,e)%n);//使用公钥e加密得到的密文
            s.add(c);
        }
        System.out.println("密文："+s);


        List<Integer> ori2 = new ArrayList<>();
        for(int c:s){
            int m = (int) (Math.pow(c,d)%n);//使用私钥d解密得到的明文
            ori2.add(m);
        }
        System.out.println("解密后的明文："+ori2);

    }
}
